package student.aistar.design.singleton.version03;

import java.io.Serializable;

public class Singleton03 implements Serializable {
    private volatile static Singleton03 instance;

    private Singleton03() {
        System.out.println("构造器私有化");
    }

    public static Singleton03 getInstance(){
        //因为本身锁就是一个比较昂贵的资源, 为了避免跑得慢的线程去抢这个把锁, 所以此处也要进行非空判断.
        if(instance == null){
            //跑的快的线程都会进入此处A, B
            //A, B线程就会去争抢锁资源, 谁抢到锁资源, 谁就会进去
            //同步代码块去执行里面的代码
            //假设A线程抢到了, B就会在等待
            synchronized (Singleton03.class){
                //A进入判断instance == null

                //只要抢到锁的线程, 如果此处没有非null判断
                //那么进入到这的线程都会区执行instance = new Singleton03();
                if(instance == null){
                    //由A线程进行实例的初始化
                    //A继续执行, 等A执行完毕之后, 那么A就会释放所资源
                    //其他线程继续抢资源
                    instance = new Singleton03();
                }
            }
        }
        return instance;
    }

}
